#!/bin/bash

# 辅助命令 log

cat <<'EOF' | tee -a ~/.bashrc

function log(){

  # 初始化变量
  local lines="-n 3000"
  local msg=""
  local after=""
  local before=""
  local count=""
  local message="ERROR"
  local sc=""
  local f=""
  local log_file=$(ls -1 -F -r logs/*.log | awk '{printf("%04d %s\n",length($0), $0)}' | sort  -n | head -1 | awk '{print $2}')
  local max_len=200

  OPTIND=1
  # 使用 getopts 解析参数
  while getopts "fn:A:B:C:m:s:l:h" opt; do
    case $opt in
      f)
        # -f 参数没有值
        f="-f"
        ;;
      n)
        lines="-n $OPTARG"
        ;;
      A)
        after="-A $OPTARG"
        ;;
      B)
        before="-B $OPTARG"
        ;;
      C)
        count="-C $OPTARG"
        ;;
      m)
        message="$OPTARG"
        ;;
      s)
        sc="$OPTARG"
        ;;
      l)
        max_len="$OPTARG"
        ;;
      h)
        # -h 参数没有值
        echo "log -f 监控文件变化 -n 最后行数 -A 显示命中的后面几行 -B 显示命中的前面几行 -C 显示命中的前后几行 -m 查找的消息 -s 过滤每行的字符数在某个范围内的行 最小字符数,最大字符数 -l 每行缩短到多少个字符后输出，缩短后行尾添加 …   -h 帮助" >&2
        echo "默认值： log -l 最后3000行数  -m ERROR" >&2
        return
        ;;
      \?)
        echo "无效的选项: -$OPTARG" >&2
        return 1
        ;;
    esac
  done
  shift $((OPTIND-1))


  if [ "$sc" = "" ]; then
     echo "tail $lines $f $log_file | grep $before $after $count \"$message\" | awk -v max="$max_len" 'length(\$0) > max { print substr(\$0, 1, max-2) \" …\" ; next } 1'"
     echo "----------------------------------------------------------------"
     tail $lines $f $log_file | grep $before $after $count "$message" | awk -v max="$max_len" 'length($0) > max { print substr($0, 1, max-2) " …" ; next } 1'
     return 0
  fi

   echo "tail $lines $f $log_file | grep $before $after $count \"$message\" | grep -E \"^.{$sc}$\""
   echo "----------------------------------------------------------------"
   tail $lines $f $log_file | grep $before $after $count "$message" | grep -E "^.{$sc}$"

}

EOF

jar_name=$(ls -1 -F -r *.jar | awk '{printf("%04d %s\n",length($0), $0)}' | sort -r -n | head -1 | awk '{print $2}')

java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80  -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=178m -Xss512k ${JAVA_OPTS} \
 -Dlog4j2.formatMsgNoLookups=true \
 -Dspring.cloud.bootstrap.enabled=true \
 -Dreactor.netty.pool.leasingStrategy=lifo \
 ${JAVA_SKYWLKING_AGENT} \
 -Dskywalking.agent.namespace="@productLine.name@" \
 -Dskywalking.collector.backend_service=${SKYWALKING_SERVER} \
 -Dskywalking.agent.service_name=${APP_NAME} \
 -Dloader.path=lib \
 --add-opens java.base/java.lang=ALL-UNNAMED \
 --add-opens java.base/java.lang.reflect=ALL-UNNAMED \
 --add-opens java.base/java.lang.invoke=ALL-UNNAMED \
 --add-opens java.base/sun.reflect.annotation=ALL-UNNAMED \
 --add-opens java.base/sun.net.www.protocol.file=ALL-UNNAMED \
 -jar $jar_name \
 --spring.main.allow-bean-definition-overriding=true \
 --spring.main.allow-circular-references=true \
 --spring.application.name=${APP_NAME} \
 --spring.profiles.active=${PROFILE} \
 --server.port=80 \
 --app.group=${APP_GROUP} \
 ${JAVA_ARGS}